package com.juc.threadPoolExecutor.threadPoolExecutor1;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Run1 {

	/**
	 * ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
	 * 1.corePoolSize 池中保存的线程数，包括空闲线程，也就是核心池的大小
	 * 2.maximumPoolSize 池中允许的最大线程数
	 * 3.keepAliveTime 当线程数量大于corePoolSize值时，在没有超过指定的时间内是不从线程池中将空闲线程
	 *  删除的，如果超过此时间单位，则删除。
	 *  
	 * 4.unit keepAliveTime参数的时间单位
	 * 5.workQueue 执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable
	 * 为更好地理解这些参数在使用上的一些关系，可以将他们进行细化的注释
	 * 1) A 代表 execute(runnable) 欲执行的runnable的 数量
	 * 2) B 代表 corePoolSize
	 * 3) C 代表 maximumPoolSize
	 * 4) D 代表 A-B(假设A>=B)
	 * 5) E 代表 new LinkedBlockingDeque<Runnable>(); 队列，无参构造参数
	 * 6) F 代表 SynchronousQueue 对列
	 * 7) G 代表 keepAliveTime
	 * 构造方法中5个参数之间都有使用上的关系，在使用线程池的过程中大部分会出现如下5种过程
	 * <A>如果A<=B 那么马上创建线程 运行这个任务 并不放入扩展队列Queue中，其他参数功能忽略
	 * <B>如果A>B&&A<=C&&E,则C和G参数忽略，并把D放入E中等待被执行
	 * <C>如果A>B&&A<=C&&F,则C和G参数有效，并且马上创建线程运行这些任务，而不把D放入F中，
	 *   D执行完任务后在指定时间后发生超时时将D进行清除。
	 * <D>如果A>B&&A>C&&E,则C和G参数忽略，并把D放入E中等待被执行
	 * <E>如果A>B&&A>C&&F,则处理C的任务，其他任务则不再处理抛出异常
	 */
	//获取基本属性 corePoolSize和 maximumPoolSize
	public static void main(String[] args) {
		ThreadPoolExecutor executor = new ThreadPoolExecutor(7, 8, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
	    System.out.println(executor.getCorePoolSize());
	    System.out.println(executor.getMaximumPoolSize());
	    System.out.println(" ");
		executor = new ThreadPoolExecutor(7, 8, 5, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
		System.out.println(executor.getCorePoolSize());
		System.out.println(executor.getMaximumPoolSize());
	}
}
